#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include "task.h"
//定义一个函数指针类型，并且typedef一下
typedef void(*func_t)();

#define N 3
func_t tasks[N]={NULL};

void LoadTask()//进程列表“任务事项”
{
    tasks[0]=PrintLog;
    tasks[1]=Download;
    tasks[2]=MysqlDataSync;
}

void HanderTask()//“执行每一个任务事项”
{
    int i=0;
    for(i=0;i<N;i++)
    {
        tasks[i]();
    }


}
void DoOtherThing()
{
    HanderTask();
}

void RunChild()
{
    int cnt=5;
    while(cnt)
    {
        cnt--;
        printf("I am a child process,pid:%d,ppid:%d,cnt:%d\n",getpid(),getppid(),cnt);
        sleep(1);
    }
}
int main()
{
    printf("I am a process ,running,pid:%d,ppid:%d\n",getpid(),getppid());
    sleep(1);
    //创建进程
    pid_t id=fork();
    if(id==0)//子进程
    {
        RunChild();
        printf("child quit....\n");
        exit(123);
    }
    LoadTask();
    sleep(1);

    while(1)
    {
        int status;
        //father父进程                          
        //父进程等待子进程——以非阻塞的形式进行等
        pid_t rid=waitpid(id,&status,WNOHANG);
        if(rid==0)//如果为waitpid的返回值为0：检测是成功的，但是子进程还没有退出，需要下一次重复等待
        {
            printf("Child is running,father check next time!\n");
            sleep(1);
            DoOtherThing();
        }
        else if(rid>0)//如果waitpid的返回值>0；等待成功，子进程退出了，父进程回收成功
        {
            //检查子进程是否正常退出WIFEXITED
            if(WIFEXITED(status))//如果子进程正常退出，返回真
            {
                printf("child quit success!quit code:%d\n",WEXITSTATUS(status));
                sleep(1);
            }
            else{
                printf("child quit fail!\n");
                sleep(1);
            }
            break;
        }
        else{
            printf("wait fail!\n");
            break;
            sleep(1);
        }
    }
    return 0;
}
